home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / aminet / text / hyper / minguide.lha / minguide.c < prev    next >
C/C++ Source or Header  |  1992-02-06  |  4KB  |  210 lines

  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. void end(char *text);
  5. void map(char *str );
  6. void readfile( FILE *file );
  7. void printnode(char *name, int retrace);
  8. void printline(char *line);
  9. int  getword( char *src, char *dst );
  10.  
  11. typedef struct line {
  12.     struct line *next;
  13.     struct line *son;
  14.     char   *prev;
  15.     char   text[1];
  16. } LINE;
  17.  
  18. FILE *infile;
  19. LINE *FirstNode, *CurNode;
  20. char Keys[4000], *Key;
  21.  
  22. void
  23. main(int argc, char *argv[])
  24. {
  25.     char nodename[256];
  26.     int  retrace=0;
  27.  
  28.     if( argc!=2 )
  29.         end("Usage: minguide <filename>");
  30.  
  31.     if( !(infile=fopen(argv[1],"r")))
  32.         end("Can't open input");
  33.  
  34.     readfile(infile);
  35.  
  36.     strcpy( nodename, "main" );
  37.     do {
  38.         printnode(nodename,retrace);
  39.         retrace=0;
  40.  
  41.         fputs("\033[37m",stdout);
  42.         fputs(CurNode->text,   stdout);
  43.         fputs(">\033[31m ",stdout);
  44.         fflush(stdout);
  45.  
  46.         gets( nodename );
  47.         if( *nodename )
  48.             map( nodename );
  49.         if( !strcmp(nodename,":"))
  50.             strcpy(nodename,"main");
  51.         if( !strcmp(nodename,"/") && CurNode->prev)
  52.             strcpy(nodename,CurNode->prev), retrace=1;
  53.         if( !strcmp(nodename,"."))
  54.             strcpy(nodename,CurNode->text), retrace=1;
  55.     } while( strlen(nodename));
  56.  
  57.     end( NULL );
  58. }
  59.  
  60. void
  61. map( char *str )
  62. {
  63.     char *k;
  64.     int  len=strlen(str);
  65.  
  66.     for( k=Keys; k<Key; k+=strlen(k)+1 )
  67.         if( !strnicmp(str,k,len )) {
  68.             strcpy(str,k);
  69.             break;
  70.         }
  71. }
  72.  
  73.  
  74. void
  75. readfile( FILE *file )
  76. {
  77.     char buf[512], *t;
  78.     LINE *line=NULL, *prevline=NULL;
  79.     LINE *node=NULL, *prevnode=NULL;
  80.  
  81.     fgets(buf,512,file);
  82.     if( strnicmp(buf,"@database",9))
  83.         end("Not an AmigaGuide file");
  84.  
  85.     while( fgets(buf,512,file) ) {
  86.         if( node && (!strnicmp(buf,"@node",5) || !strnicmp(buf,"@endnode",8))) {
  87.             prevnode=node;
  88.             node=NULL;
  89.         }
  90.         if( !strnicmp(buf,"@node",5)) {
  91.             node= (void*)malloc( sizeof(*node)+strlen(buf));
  92.             node->next=NULL;
  93.  
  94.             if(!(t=strchr( buf, ' ')))
  95.                 break;
  96.             *t=0;
  97.             strcpy( node->text, t+1 );
  98.             if( (t=strchr( node->text, ' ')) || (t=strchr( node->text, '\n')))
  99.                 *t=0;
  100.  
  101.             if( prevnode ) 
  102.                 prevnode->next=node;
  103.             else
  104.                 FirstNode=node;
  105.  
  106.             line=NULL;
  107.  
  108.         } else if( node ) {
  109.             prevline=line;
  110.             line= (void*)malloc( sizeof(*line)+strlen(buf));
  111.             line->next=NULL;
  112.             strcpy( line->text,buf );
  113.             if( prevline ) 
  114.                 prevline->next=line;
  115.             else 
  116.                 node->son= line;
  117.         }
  118.     }
  119. }
  120.  
  121. void
  122. printnode(char *name, int retrace)
  123. {
  124.     LINE *node, *line;
  125.     int  len=strlen(name);
  126.  
  127.     for( node=FirstNode; node; node=node->next )
  128.         if( !stricmp(node->text,name ))
  129.             goto found;
  130.     for( node=FirstNode; node; node=node->next )
  131.         if( !strnicmp(node->text,name,len ))
  132.             break;
  133.  
  134. found:
  135.     if( !node )
  136.         puts("Page not found");
  137.     else {
  138.         Key=Keys;
  139.         if( !retrace )
  140.             node->prev= CurNode->text;
  141.         CurNode=node;
  142.         for( line=node->son; line; line=line->next )
  143.             printline(line->text);
  144.     }
  145.     fflush(stdout);
  146. }
  147.  
  148. void
  149. printline( char *s )
  150. {
  151.     char dest[512], *d=dest, *t;
  152.  
  153.     if( (t=strchr(s,'\n')))
  154.         *t=0;
  155.  
  156.     if( *s=='@' )
  157.         return;
  158.  
  159.     while( *s ) {
  160.         if( s[0]=='@' && s[1]=='{' ) {
  161.             *d++=27; *d++='['; *d++='7'; *d++='m';
  162.             s+=2;
  163.             s+=getword(s,d);
  164.             d+=strlen(d);
  165.             *d++=27; *d++='['; *d++='m';
  166.             s+=getword(s,d);
  167.             s+=getword(s,Key);
  168.             Key+=strlen(Key)+1;
  169.             while( *s && *s!='}' )
  170.                 s++;
  171.             if( *s=='}' )
  172.                 s++;
  173.         } else
  174.             *d++=*s++;
  175.     }
  176.     *d++=0;
  177.     puts( dest );
  178.     fflush( stdout );
  179. }
  180.  
  181. int
  182. getword( char *src, char *d )
  183. {
  184.     char *s=src;
  185.  
  186.     while( *s==' ' )
  187.         s++;
  188.  
  189.     while( *s && *s!=' ' && *s!='}')
  190.         if( *s=='\"' ) {
  191.             s++;
  192.             while( *s && *s!='\"' )
  193.                 *d++=*s++;
  194.             if( *s=='\"' )
  195.                 s++;
  196.         } else 
  197.             *d++=*s++;
  198.     *d++=0;
  199.  
  200.     return s-src;
  201. }
  202.  
  203. void
  204. end(char *text)
  205. {
  206.     if( infile ) fclose(infile);
  207.     if( text )   puts(text);
  208.     exit(0);
  209. }
  210.